package com.ruogu.codegeneration.service;

import com.mybatisflex.core.paginate.Page;
import com.mybatisflex.core.query.QueryWrapper;
import com.mybatisflex.core.service.IService;
import com.ruogu.codegeneration.model.dto.chathistory.ChatHistoryQueryRequest;
import com.ruogu.codegeneration.model.entity.ChatHistory;
import com.ruogu.codegeneration.model.entity.User;
import com.ruogu.codegeneration.model.vo.chathistory.ChatHistoryVO;
import dev.langchain4j.memory.chat.MessageWindowChatMemory;

import java.time.LocalDateTime;
import java.util.List;

/**
 * 对话历史服务层
 *
 * @author ruogu
 */
public interface ChatHistoryService extends IService<ChatHistory> {

    /**
     * 保存用户消息
     *
     * @param appId   应用ID
     * @param userId  用户ID
     * @param message 消息内容
     * @return 保存的对话历史ID
     */
    Long saveUserMessage(Long appId, Long userId, String message);

    /**
     * 保存AI消息
     *
     * @param appId   应用ID
     * @param userId  用户ID
     * @param message AI消息内容
     * @return 保存的对话历史ID
     */
    Long saveAiMessage(Long appId, Long userId, String message);

    /**
     * 保存AI错误消息
     *
     * @param appId        应用ID
     * @param userId       用户ID
     * @param errorMessage 错误信息
     * @return 保存的对话历史ID
     */
    Long saveAiErrorMessage(Long appId, Long userId, String errorMessage);

    /**
     * 根据应用ID删除对话历史
     *
     * @param appId 应用ID
     * @return 删除的记录数
     */
    int deleteByAppId(Long appId);

    /**
     * 根据应用ID分页获取对话历史
     *
     * @param appId           应用ID
     * @param pageSize        分页大小
     * @param lastCreateTime  最后创建时间
     * @param loginUser       登录用户
     * @return 对话历史列表
     */
    Page<ChatHistory> listAppChatHistoryByPage(Long appId, int pageSize,
                                               LocalDateTime lastCreateTime,
                                               User loginUser);
    /**
     * 将ChatHistory对象转换为ChatHistoryVO对象
     *
     * @param chatHistory 对话历史实体对象
     * @return ChatHistoryVO 对话历史返回对象
     */
    ChatHistoryVO getChatHistoryVO(ChatHistory chatHistory);

    /**
     * 将对话历史实体列表转换为对话历史VO列表
     *
     * @param chatHistoryList 对话历史实体列表
     * @return 对话历史VO列表
     */
    List<ChatHistoryVO> getChatHistoryVOList(List<ChatHistory> chatHistoryList);

    /**
     * 获取查询条件 QueryWrapper
     *
     * @param chatHistoryQueryRequest 对话历史查询请求
     * @return 查询条件
     */
    QueryWrapper getQueryWrapper(ChatHistoryQueryRequest chatHistoryQueryRequest);

    /**
     * 校验对话历史参数
     *
     * @param chatHistory 对话历史实体
     * @param add         是否为创建校验
     */
    void validChatHistory(ChatHistory chatHistory, boolean add);

    /**
     *  加载对话历史到内存
     * @param appId 应用ID
     * @param chatMemory 对话历史内存
     * @param maxCount 最大数量
     * @return 加载的记录数
     */

    int loadChatHistoryToMemory(Long appId, MessageWindowChatMemory chatMemory, int maxCount);


}
